import axios, { type AxiosError } from 'axios'
import { ElMessage } from 'element-plus'
import { useUserStore } from '@/stores/user' // 确保你的 store 路径是 'stores' 还是 'store'
import router from '@/router'

// 1. 创建 Axios 实例
const request = axios.create({
  // 基础 URL，所有请求都会自动带上 /api 前缀
  // 这样配置是为了方便后续的 Vite 代理
  baseURL: '/api',
  timeout: 5000 // 请求超时时间
})

// 2. 请求拦截器 (Request Interceptor)
request.interceptors.request.use(
  (config) => {
    // 在发送请求前做些什么
    // ❗️在拦截器内部获取 store，防止循环依赖
    const userStore = useUserStore()

    // 如果有 token，则在请求头中携带
    if (userStore.token) {
      config.headers['Authorization'] = `Bearer ${userStore.token}`
    }
    return config
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 3. 响应拦截器 (Response Interceptor)
// 3. 响应拦截器 (Response Interceptor)
request.interceptors.response.use(
  (response) => {
    // 2xx 范围内的状态码都会触发该函数
    const res = response.data

    // 核心修复：检查业务状态码是否为 0 (表示成功)
    if (res.code !== 0) { // ❗️ 将 200 改为 0

      // 排除 Token 失效等特殊 code，只处理一般业务错误
      if (res.code === 401) {
        // Token 过期或无效的特殊处理，通常应该在下面的 error 拦截器中处理 HTTP 401
        // 如果后端在 HTTP 200 状态下返回 401 业务码，则在这里处理
      }

      ElMessage.error(res.message || '业务错误，请联系管理员')

      // 返回一个被拒绝的 Promise，这样 Login.vue 中的 .catch 就会被触发
      return Promise.reject(new Error(res.message))
    }

    // code 为 0，表示业务成功，直接返回整个响应体
    return res
  },
  (error: AxiosError) => {
    // 超出 2xx 范围的状态码都会触发该函数
    // 处理 HTTP 网络错误
    let message = ''
    const status = error.response?.status

    switch (status) {
      case 401:
        message = 'Token 无效或已过期，请重新登录'
        // ❗️执行登出操作并跳转到登录页
        const userStore = useUserStore()
        userStore.logout()
        router.push('/login')
        break
      case 404:
        message = '请求地址不存在'
        break
      case 500:
        message = '服务器内部错误'
        break
      default:
        message = error.message
    }

    ElMessage.error(message)
    return Promise.reject(error)
  }
)

request.interceptors.request.use(
  (config) => {
    console.log('📤 完整请求配置:', {
      method: config.method,
      url: config.url,
      baseURL: config.baseURL,
      params: config.params,
      data: config.data,
      headers: config.headers
    })

    const token = localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  (error) => {
    console.error('❌ 请求拦截器错误:', error)
    return Promise.reject(error)
  }
)

// 4. 导出实例
export default request
